﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Business;
using Entity;
using Entity.Custom;
using Newtonsoft.Json;
using Utilities;

namespace FreshCms.BackEnd.Handler
{
    /// <summary>
    /// Summary description for User
    /// </summary>
    public class User : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
        #region Declare variable for check pms
        Int32 ui = 0;
        InPms chkPms = new InPms();
        InUser CurrentUser = new InUser();
        #endregion

        public void ProcessRequest(HttpContext context)
        {
            string m = "";
            var response = new ResponseData();

            #region Get PanelId and Check Psm
            CurrentUser = InUserBusiness.GetSessionInUser();
            if (!string.IsNullOrEmpty(context.Request["ui"]))
            {
                Int32.TryParse(context.Request["ui"], out ui);
                if (ui > 0)
                    chkPms = InPmsBusiness.CheckSessionPms(ui);
                if (chkPms == null)
                    chkPms = new InPms { PmsView = 0, PmsUpdate = 0, PmsDelete = 0 };
            }
            #endregion

            if (context.Request.RequestType == "POST")
            {
                if (context.Request["m"] != null)
                    m = context.Request["m"];
                else
                    return;
            }
            else
            {
                if (context.Request.QueryString["m"] != null)
                    m = context.Request.QueryString["m"];
                else
                    return;
            }

            switch (m.ToLower())
            {
                case "add":
                    response = AddUser(context);
                    break;
                case "delete":
                    response = DeleteUser(context);
                    break;
            }

            context.Response.ContentType = "application/x-javascript";

            string callBack = context.Request["callback"];
            if (!string.IsNullOrEmpty(callBack))
            {
                context.Response.Write(callBack + "( " + JsonConvert.SerializeObject(response) + " );");
            }
            else
                context.Response.Write(JsonConvert.SerializeObject(response));
        }

        private ResponseData AddUser(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };
            
            var response = new ResponseData();

            string username, pwd, email, fullname, phone, strBirth, ava, iden = "";
            Int32 userstatus = 0;
            Int32 groupid = 0;
            Int32 userid = 0;
            Int32 changepwd = 0;
            Int32 superAdmin = 0;
            pwd = "";
            ava = "";
            DateTime birth = DateTime.Now;

            if (!string.IsNullOrEmpty(context.Request["fullname"])
                && !string.IsNullOrEmpty(context.Request["phone"])
                && !string.IsNullOrEmpty(context.Request["email"])
                && !string.IsNullOrEmpty(context.Request["iden"])
                && !string.IsNullOrEmpty(context.Request["groupid"])
                && !string.IsNullOrEmpty(context.Request["stt"]))
            {
                if (!string.IsNullOrEmpty(context.Request["id"]))
                    Int32.TryParse(context.Request["id"], out userid);
                if (!string.IsNullOrEmpty(context.Request["avatar"]))
                    ava = context.Request["avatar"];
                if (!string.IsNullOrEmpty(context.Request["birth"]))
                {
                    strBirth = context.Request["birth"];
                    birth = DateTime.ParseExact(strBirth, "d/M/yyyy", null);
                }
                if (!string.IsNullOrEmpty(context.Request["changepwd"]))
                    Int32.TryParse(context.Request["changepwd"], out changepwd);
                fullname = context.Request["fullname"];
                phone = context.Request["phone"];
                email = context.Request["email"];
                iden = context.Request["iden"];
                Int32.TryParse(context.Request["groupid"], out groupid);
                //username = context.Request["user"];
                Int32.TryParse(context.Request["stt"], out userstatus);
                Int32.TryParse(context.Request["superadmin"], out superAdmin);
                
                if (userid == 0) // neu la them moi thi se check ton tai Email
                {
                    // Check xem Username da ton tai hay chua
                    Int32 chkUsername = InUserBusiness.CheckInUserEmailExist(email);
                    if (chkUsername > 0)
                    {
                        response.Data = -1;
                        response.Success = false;
                        response.Message = "Email này đã tồn tại trên hệ thống, hãy chọn 1 tài khoản khác.";
                        return response;
                    }
                    // neu la them moi thi lay pass mac dinh he thong
                    pwd = Utils.MD5Encrypt(Constant.DefaultPassword);
                }
                else
                {
                    if (changepwd > 0) // neu checkbox chang pass dc Tich thi lay pass mac dinh he thong
                        pwd = Utils.MD5Encrypt(Constant.DefaultPassword);
                }

                InUser obj = new InUser
                {
                    UserId = userid,
                    GroupId = groupid,
                    UserName = "",
                    UserPass = pwd,
                    UserMail = email,
                    UserPhone = phone,
                    UserFullname = fullname,
                    UserBirthday = birth,
                    UserAvatar = ava,
                    UserIdentity = iden,
                    UserStatus = userstatus,
                    IsSuperAdmin = superAdmin
                };

                if (userid == 0) // neu la them moi thi se check ton tai Email
                {
                    var returnval = InUserBusiness.InsertInUser(obj);
                    if (returnval > 0)
                    {
                        response.Data = returnval;
                        response.Message = "Call Insert OK, return ID INSERTED";
                        response.Success = true;
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 1,
                            Field1 = "Thêm người dùng mới thành công",
                            Field2 = "Tài khoản Email người dùng mới: " + email,
                            Field3 = "",
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.Data = returnval;
                        response.Message = "Call Insert ERROR";
                        response.Success = false;
                    }
                }else
                {
                    if (InUserBusiness.UpdateInUser(obj) > 0)
                        response.Data = userid;
                    response.Message = "Call Update OK, return ID UPDATED";
                    response.Success = true;
                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 2,
                        Field1 = "Update Tài khoản Email người dùng thành công",
                        Field2 = "Tài khoản Email người dùng được thay đổi thông tin: " + email,
                        Field3 = "",
                        LogId = 0
                    });
                }
                
            }
            else
            {
                response.Data = -1;
                response.Message = "Param not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData DeleteUser(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsDelete == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoDelete, Success = false };

            var response = new ResponseData();
            if (!string.IsNullOrEmpty(context.Request["id"]))
            {
                var userid = 0;
                Int32.TryParse(context.Request["id"], out userid);
                if (userid > 0)
                {
                    response.Data = InUserBusiness.DeleteInUser(userid);
                    response.Message = "Call Delete OK";
                    response.Success = true;
                    // log system 
                    InLogBusiness.InsertInLog(new InLog
                    {
                        UserId = CurrentUser.UserId,
                        LogAction = 0,
                        Field1 = "Xóa Tài khoản Email người dùng thành công",
                        Field2 = "ID người dùng bị xóa: " + userid,
                        Field3 = "",
                        LogId = 0
                    });
                }
                else
                {
                    response.Data = userid;
                    response.Message = "Tham số UserId không đúng.";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Không có tham số.";
                response.Success = false;
            }
            return response;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}